package visitor;

import operator.Cat;
import operator.Minus;
import operator.Plus;
import operator.Produs;
import arbori.Nod;
import functiiElementare.Constanta;
import functiiElementare.Necunoscuta;
import functiiTrigonometrice.Cos;
import functiiTrigonometrice.Sin;

public class DerivareVisitor extends Visitor {
        private String s;
        private ToStringVisitor tsv= new ToStringVisitor();
        public DerivareVisitor(String s)
        {
                this.s=s;
                tsv=new ToStringVisitor();
        }
        public DerivareVisitor()
        {
                this.s="";
        }
        public String getRezultat()
        {
                return this.s;
        }
        public void setRezultat(String rez)
        {
                this.s=rez;
        }
        public void visit(Plus p)
        {
                if((p.getfStang()!=null)&&(p.getfDrept()!=null))
                {
                        visit(p.getfStang());
                        String s1=this.s;
                        visit(p.getfDrept());
                        String s2=this.s;
                        s=p.concatTermeni(s1,s2);
                }
        }
        public void visit(Minus m)
        {
                if((m.getfStang()!=null)&&(m.getfDrept()!=null))
                {
                        visit(m.getfStang());
                        String s1=this.s;
                        visit(m.getfDrept());
                        String s2=this.s;
                        s=m.concatTermeni(s1,s2);
                }
        } 
        public void visit(Produs p)
        {
                if((p.getfStang()!=null)&&(p.getfDrept()!=null))
                {
                        visit(p.getfStang());
                        String f1D=this.s;
                        visit(p.getfDrept());
                        String f2D=this.s;
                        p.getfStang().acceptVisitor(tsv);
                        String f1=tsv.getS();
                        p.getfDrept().acceptVisitor(tsv);
                        String f2=tsv.getS();
                        this.s=Plus.concatTermens(Produs.concatTermens(f1D,f2),Produs.concatTermens(f1, f2D));
                        
                        
                }
        }
        public void visit(Cat c)
        {
                if((c.getfStang()!=null)&&(c.getfDrept()!=null))
                {
                        visit(c.getfStang());
                        String f1D=this.s;
                        visit(c.getfDrept());
                        String f2D=this.s;
                        c.getfStang().acceptVisitor(tsv);
                        String f1=tsv.getS();
                        c.getfDrept().acceptVisitor(tsv);
                        String f2=tsv.getS();
                        this.s=Cat.concatTermens(Minus.concatTermens(Produs.concatTermens(f1D,f2),Produs.concatTermens(f1, f2D)),Produs.concatTermens(f2,f2));
                        
                        
                }
        }
        public void visit(Constanta c)
        {
                this.s="0";
        }
        public void visit(Necunoscuta n)
        {
                this.s="1";
        }
        public void visit(Sin s)
        {
                if(s.getfStang()!=null)
                {
                        visit(s.getfStang());
                        String fsd=this.s;
                        s.getfStang().acceptVisitor(tsv);
                        String fs=tsv.getS();
                        this.s=Produs.concatTermens(Cos.concatTermens(fs),fsd);
                        
                }
                
        }
        public void visit(Cos c)
        {
                if(c.getfStang()!=null)
                {
                        visit(c.getfStang());
                        String fsd=this.s;
                        c.getfStang().acceptVisitor(tsv);
                        String fs=tsv.getS();
                        this.s=Produs.concatTermens(Sin.concatTermens(fs),fsd);
                        
                }
                
        }
        public void visit(Nod n)
        {
                if(n instanceof Plus)
                {
                        visit((Plus)n);
                }
                if(n instanceof Minus)
                {
                        visit((Minus)n);
                }
                if(n instanceof Produs)
                {
                        visit((Produs)n);
                }
                if(n instanceof Cat)
                {
                        visit((Cat)n);
                }
                if(n instanceof Necunoscuta)
                        {
                          visit((Necunoscuta)n);
                         }
                  if(n instanceof Constanta)
                    {
                         visit((Constanta)n);
                    }
             if(n instanceof Sin)
            {
                   visit((Sin)n);
            }
             if(n instanceof Cos)
                    {
                           visit((Cos)n);
                    }
        }
        

}